package add_two_numbers

type ListNode struct {
	Val int
	Next *ListNode
}


func AddTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
	//为实现统一，创建一个首节点
	head := &ListNode{ 0 , nil }
	//n1表示l1当前节点的值，n2表示l2当前节点的值，carry表示进位，current表示新建链表的当前节点
	n1 , n2 , carry , current := 0 , 0 , 0 , head
	//我们可以统一的来看，只要两个链表其中一个不为空或者一个进位值不为0，则循环
	for l1 != nil  || l2 != nil || carry != 0 {
		//判断l1节点是否为空，如果为空就不能进行遍历下一个节点，n1值为0
		if l1 == nil {
			n1 = 0
		} else {
			n1 = l1.Val
			l1 = l1.Next
		}
		if l2 == nil {
			n2 = 0
		} else {
			n2 = l2.Val
			l2 = l2.Next
		}
		//建立当前节点，取余为当前节点的值
		node := ListNode{(n2 + n1 + carry) % 10 , nil }
		//当前节点和进位的和除以10，得到的数为进位
		carry = (n1 + n2 + carry) /10
		current.Next =&node
		//指针移动到下一个节点
		current = current.Next
	}
	//返回的是head.Next，因为我们的头节点都是0，是一个虚拟节点
	return head.Next
}